package com.xhwy.mapper;

import com.xhwy.entity.Product;
import com.xhwy.param.ProductParam;
import com.xhwy.param.ProductInventoryParam;
import com.xhwy.param.ProductQueryParam;
import com.xhwy.util.PageUtil;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.List;

@Mapper
@Repository //持久层
public interface ProductMapper {

    /**
     * 分页获取商品列表
     * @param product
     * @param pageUtil
     * @return
     */
    List<Product> queryAllByLimit(Product product, @Param("pageUtil") PageUtil<Product> pageUtil);

    /**
     * 统计总行数
     * @param product
     * @return
     */
    int count(Product product);

    /**
     * 根据id删除商品
     * @param productId
     * @return
     */
    int deleteProductById(Integer productId);

    /**
     * 添加商品
     * @param product
     * @return
     */
    int addProduct(Product product);

    /**
     * 获取指定数量的推荐商品
     * @param limit
     * @return
     */
    List<Product> getRecommendList(int limit);
    /**
     * 获取指定数量的热销商品
     * @param limit
     * @return
     */
    List<Product> getHotProductList(int limit);

    /**
     * 根据参数分页获取商品数据
     * @param productQueryParam 关键字和商品类型
     * @return
     */
    List<Product> getByProductType(ProductQueryParam productQueryParam);

    /**
     * 根据参数获取商品数据总数
     * @param productQueryParam 关键字和商品类型
     * @return
     */
    int getCountByProductType(ProductQueryParam productQueryParam);

    /**
     * 根据商品id获取商品信息
     * @param productId
     * @return
     */
    Product getByProductId(Integer productId);

    /**
     * 根据商品id集合获取商品数据
     * @param productIds
     * @return
     */
    List<Product> getByProductIdCollection(Collection<Integer> productIds);

    /**
     * 批量修改商品的库存和销量
     * @param productInventoryParams
     * @return
     */
    int batchUpdateInventoryAndSalesVolume(List<ProductInventoryParam> productInventoryParams);

    /**
     * 修改商品
     * @param product
     * @return
     */
    int updateProduct(Product product);
}
